package com.sx.service.serviceImpl;

import com.sx.dao.PersonDao;
import com.sx.dao.daoImpl.PersonDaoImpl;
import com.sx.pojo.OptionRecords;
import com.sx.pojo.Person;
import com.sx.service.OptionRecordService;
import com.sx.service.PersonService;

import java.sql.SQLException;
import java.util.ArrayList;

// 实现PersonService接口

public class PersonServiceImpl implements PersonService {
    //创建一个personDao对象
    private final PersonDao personDao = new PersonDaoImpl();
    private final OptionRecordService optionRecordService = new OptionRecordServiceImpl();

    /**
     * 根据学生代码和密码查找用户
     * 此方法用于验证用户的登录信息，通过调用personDao中的相应方法来实现
     *
     * @param username 学生代码，用于标识用户
     * @param password 用户密码，用于验证用户身份
     * @return 返回一个Person对象，如果找不到匹配的用户，则返回null
     * @throws SQLException 如果数据库操作失败，抛出此异常
     */
    @Override
    public Person findUserByStuCodeAndPassword(String username, String password) throws SQLException {
        return personDao.findUserByStuCodeAndPassword(username, password);
    }

    /**
     * 获取所有人员信息
     * 此方法用于从数据源获取所有人员的信息列表它没有输入参数，
     * 并返回一个包含所有Person对象的ArrayList如果列表为空，则返回空的ArrayList
     *
     * @return 包含所有Person对象的ArrayList如果没有任何人员信息，则返回空列表
     */
    @Override
    public ArrayList<Person> getAllPerson() {
        return personDao.getAllPerson();
    }

    /**
     * 根据学生代码查找用户
     *
     * @param id 学生代码，用于在数据库中查询用户
     * @return 如果找到用户，则返回true；否则返回false
     */
    @Override
    public boolean findUserByStuCode(String id) {
        return personDao.findUserByStuCode(id);
    }

    /**
     * 添加个人信息
     * 此方法用于将一个Person对象添加到数据存储中
     * 它调用了PersonDao接口的addPerson方法来实现具体的添加操作
     *
     * @param person 要添加的Person对象，包含个人信息
     * @return 添加操作的成功与否如果添加成功，返回true；否则，返回false
     */
    /*@Override
    public boolean addPerson(Person person) {
        return personDao.addPerson(person);
    }*/
    @Override
    public boolean addPerson(Person person, String PersonId, String PersonName, int flag, int type, String id) {
        OptionRecords OptionRecords = new OptionRecords();
        OptionRecords.setPersonId(PersonId);
        OptionRecords.setPersonName(PersonName);
        OptionRecords.setFlag(flag);
        OptionRecords.setType(type);
        OptionRecords.setBeOption(null);
        OptionRecords.setAfOption(person.toString());
        if (personDao.addPerson(person)) {
            optionRecordService.addOptionRecord(OptionRecords.getPersonId(), OptionRecords.getPersonName(), OptionRecords.getBeOption(), OptionRecords.getAfOption(), OptionRecords.getFlag(), OptionRecords.getType());
            return true;
        } else {
            return false;
        }
    }


    /**
     * 根据ID删除个人信息
     * 该方法用于调用personDao的deletePersonById方法，以删除指定ID的个人信息
     * 主要作用是为上层提供一个接口，通过此接口可以删除不再需要的个人信息记录
     *
     * @param id 个人信息的唯一标识符，用于指定需要删除的记录
     * @return 返回一个布尔值，表示删除操作的结果true表示删除成功，false表示删除失败
     */
   /* @Override
    public boolean deletePersonById(String id) {
        return personDao.deletePersonById(id);
    }*/
    @Override
    public boolean deletePersonById(String PersonId, String PersonName, int flag, int type, String id) {
        OptionRecords OptionRecords = new OptionRecords();
        OptionRecords.setPersonId(PersonId);
        OptionRecords.setPersonName(PersonName);
        OptionRecords.setFlag(flag);
        OptionRecords.setType(type);
        OptionRecords.setBeOption(null);
        OptionRecords.setAfOption(personDao.getPersonById(id).toString());
        if (personDao.deletePersonById(id)) {
            optionRecordService.addOptionRecord(OptionRecords.getPersonId(), OptionRecords.getPersonName(), OptionRecords.getBeOption(), OptionRecords.getAfOption(), OptionRecords.getFlag(), OptionRecords.getType());
            return true;
        } else {
            return false;
        }

    }

    /**
     * 根据ID获取Person对象
     * 此方法覆盖自接口（或父类），用于根据给定的ID查询并返回相应的Person对象
     * 主要解决了如何通过ID在数据库中查询Person信息的问题
     *
     * @param id 人的唯一标识符，用于数据库中查询特定的Person记录
     * @return 返回一个Person对象，包含从数据库中查询到的信息如果找不到对应ID的Person，则返回null
     */
    @Override
    public Person getPersonById(String id) {
        return personDao.getPersonById(id);
    }


    /**
     * 更新个人信息
     * 此方法用于更新数据库中的Person对象信息它接受一个Person对象作为参数，
     * 并尝试在数据库中更新该对象的信息如果更新操作成功，方法返回true；
     * 否则返回false
     *
     * @param person 需要更新的Person对象，包含更新后的信息
     * @return 更新操作是否成功true表示成功，false表示失败
     * @throws SQLException 如果数据库操作失败，抛出此异常
     */
    /*@Override
    public boolean updatePerson(Person person) throws SQLException {
        return personDao.updatePerson(person);
    }*/
    @Override
    public boolean updatePerson(Person person, String PersonId, String PersonName, int flag, int type, String id) {
        OptionRecords OptionRecords = new OptionRecords();
        OptionRecords.setPersonId(PersonId);
        OptionRecords.setPersonName(PersonName);
        OptionRecords.setFlag(flag);
        OptionRecords.setType(type);
        OptionRecords.setBeOption(personDao.getPersonById(id).toString());
        OptionRecords.setAfOption(person.toString());
        if (personDao.updatePerson(person)) {
            optionRecordService.addOptionRecord(OptionRecords.getPersonId(), OptionRecords.getPersonName(), OptionRecords.getBeOption(), OptionRecords.getAfOption(), OptionRecords.getFlag(), OptionRecords.getType());
            return true;
        } else {
            return false;
        }
    }

    /**
     * 根据ID获取人员姓名
     * 此方法用于通过人员的唯一标识ID来获取该人员的姓名
     * 主要作用是封装对personDao层的调用，以便在更高层次中以更抽象的方式处理逻辑
     *
     * @param id 人员的唯一标识符
     * @return 返回对应ID的人员姓名如果找不到对应的ID，则返回null或空字符串，具体取决于personDao的实现
     */
    @Override
    public String getPersonNameById(String id) {
        return personDao.getPersonNameById(id);
    }
}
